#ifndef __BASE_EXAPTION__
#define __BASE_EXAPTION__
#ifndef CC_BC32
#define GEN_ERROR(message) throw lampe::exception::Base(__LINE__,__FILE__,__FUNCTION__,message)
#else
#define GEN_ERROR(message) throw lampe::exception::Base(message)
#endif

#include "../types.h"
#include "../StringUtils.h"

namespace lampe{
namespace exception{


/***
* @class Base
* Класс ошибки. При желании выкинуть ошибку лучше использовать именно этот класс и его наследников
* */
class Base:public std::exception{
private:
#ifndef CC_BC32
u32 line;
String file;
String method;
#endif
String message;
public:
#ifndef CC_BC32
	Base(u32 l,String f,String m,String m2):line(l),file(f),method(m),message(m2){
		//nothing
	}
#else
	Base(String m2):message(m2){
		//nothing
	}
#endif
	virtual ~Base() throw(){
		//nothing
	}

	String toString() const throw(){
	#ifndef CC_BC32
		return file+":"+str::fromU32(line)+" "+method+" "+message;
	#else
		return message;
	#endif
	}
	virtual const char* what() const throw(){
		return toString().c_str();
	}
};

}//namespace exception
}//namespace lampe
#endif
